package com.nti56.springboot.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.nti56.springboot.model.TreeNode;

public class TreeNodeUtil {
	
	public static String STATE_OPEN = "open";
	public static String STATE_CLOSED ="closed";
	
	/**
	 * 利用反射把属性加到 Attributes中
	 * @return
	 */
	public static Map<String, Object> getAttributes(Object obj){
		Map<String, Object> attributes = new HashMap<String, Object>();
        String[] fieldNames = ReflectionUtils.getFiledName(obj);
        for(String fieldName : fieldNames){
        	Object value = ReflectionUtils.getFieldValueByName(fieldName, obj);
        	if(value!=null){
        		attributes.put(fieldName, value);
        	}
        }
        return attributes;
	}
	
	/**
     * 获取父节点菜单
     * @param treesList 所有树菜单集合
     * @return
     */
    public final static List<TreeNode> getFatherNode(List<TreeNode> treesList){
        List<TreeNode> newTrees = new ArrayList<TreeNode>();
        for (TreeNode mt : treesList) {
            if (StringUtil.isEmpty(mt.getpId()) 
            		|| "-1".equals(mt.getpId()) 
            			|| "0".equals(mt.getpId())) {//如果pId为空，-1，0，则该节点为根节点
                //递归获取父节点下的子节点
                mt.setChildren(getChildrenNode(mt.getId(), treesList));
                newTrees.add(mt);
            }
        }
        return newTrees;
    }
    
    /**
     * 递归获取子节点下的子节点
     * @param pId 父节点的ID
     * @param treesList 所有菜单树集合
     * @return
     */
    public final static List<TreeNode> getChildrenNode(String pId, List<TreeNode> treesList){
        List<TreeNode> newTrees = new ArrayList<TreeNode>();
        for (TreeNode mt : treesList) {
            if (StringUtil.isEmpty(mt.getpId())) continue;
            if(mt.getpId().equals(pId)){
                //递归获取子节点下的子节点，即设置树控件中的children
                mt.setChildren(getChildrenNode(mt.getId(), treesList));
                newTrees.add(mt);
            }
        }
        return newTrees;
    }
    
	/**
	 * 获取指定父节点下的所有子节点，  返回数据本身不包含父节点
	 * @param all  扁平结构
	 * @param parentId
	 * @return
	 */
	public static List<TreeNode> getChilds(List<TreeNode> all, String parentId){  		
		List<TreeNode> childList = new ArrayList<TreeNode>();
		for (TreeNode t : all) {
			// 判断是否存在子节点
			if (t.getpId()!= null && t.getpId().equals(parentId)) {
				// 递归遍历下一级
				t.setChildren(getChilds(all, t.getId().toString()));
				childList.add(t);
			}
		}
		return childList;
	}
	
	/**
	 * 根据父节点，获取所有 简单格式的 ，子节点
	 * @param childTreeNode   结果集
	 * @param nodeList  扁平数据结构
	 * @param pId
	 * @return
	 */
	public static List<TreeNode> getSimpleChilds(List<TreeNode> childTreeNode,List<TreeNode> nodeList, String pId) {
		for (TreeNode mu : nodeList) {
			//遍历出父id等于参数的id，add进子节点集合
			if (pId.equals(mu.getpId())) {
				//递归遍历下一级
				getSimpleChilds(childTreeNode,nodeList, mu.getId());
				childTreeNode.add(mu);
			}
		}
		return childTreeNode;
	}
	
	/**
	 * 根据当前节点的父节点    获取所有 简单格式的 
	 * @param childTreeNode   结果集
	 * @param nodeList  扁平数据结构
	 * @param pId
	 * @return
	 */
	public static List<TreeNode> getParents(List<TreeNode> parentNodes,List<TreeNode> nodeList, String pId) {
		for (TreeNode mu : nodeList) {
			//遍历出父id等于参数的id，add进子节点集合
			if (pId != null && pId.equals(mu.getId())) {
				//递归遍历下一级
				getParents(parentNodes,nodeList, mu.getpId());
				parentNodes.add(mu);
			}
		}
		return parentNodes;
	}
}
